from flask import Flask, render_template, request, redirect, url_for, flash
import sqlite3
import datetime
import markdown
import os

app = Flask(__name__)
app.secret_key = 'your_secret_key'  # 用于flash消息

# 初始化数据库
def init_db():
    conn = sqlite3.connect('notes.db')
    cursor = conn.cursor()
    
    # 创建笔记表
    cursor.execute('''
        CREATE TABLE IF NOT EXISTS notes (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            title TEXT NOT NULL,
            content TEXT NOT NULL,
            created_at TEXT NOT NULL,
            updated_at TEXT NOT NULL
        )
    ''')
    
    # 插入一些示例笔记（如果表为空）
    cursor.execute('SELECT COUNT(*) FROM notes')
    count = cursor.fetchone()[0]
    
    if count == 0:
        now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        
        sample_notes = [
            ('欢迎使用笔记应用', '# 欢迎使用笔记应用\n\n这是一个简单的笔记应用，支持Markdown格式。\n\n## 功能特点\n- 创建、编辑、查看和删除笔记\n- 支持Markdown格式\n- 按关键词搜索笔记\n\n## 使用方法\n点击"新建笔记"按钮开始创建你的第一条笔记吧！', now, now),
            ('Markdown语法示例', '# Markdown语法示例\n\n## 标题\n# 一级标题\n## 二级标题\n### 三级标题\n\n## 文本格式\n**粗体文本**\n*斜体文本*\n\n## 列表\n### 无序列表\n- 项目1\n- 项目2\n- 项目3\n\n### 有序列表\n1. 第一步\n2. 第二步\n3. 第三步\n\n## 链接\n[百度](https://www.baidu.com)', now, now),
            ('我的第一个笔记', '这是我的第一个笔记内容。\n\n我可以在这里记录一些重要的信息，比如：\n- 购物清单\n- 学习笔记\n- 工作计划\n\n这个应用很简单但很实用！', now, now)
        ]
        
        cursor.executemany('INSERT INTO notes (title, content, created_at, updated_at) VALUES (?, ?, ?, ?)', sample_notes)
    
    conn.commit()
    conn.close()

# 获取所有笔记
def get_all_notes(search_query=None):
    conn = sqlite3.connect('notes.db')
    cursor = conn.cursor()
    
    if search_query:
        # 使用LIKE进行模糊搜索
        cursor.execute('SELECT id, title, content, created_at, updated_at FROM notes WHERE title LIKE ? OR content LIKE ? ORDER BY created_at DESC', 
                      (f'%{search_query}%', f'%{search_query}%'))
    else:
        # 获取所有笔记，按创建时间倒序排列
        cursor.execute('SELECT id, title, content, created_at, updated_at FROM notes ORDER BY created_at DESC')
    
    notes = cursor.fetchall()
    conn.close()
    return notes

# 获取单个笔记
def get_note_by_id(note_id):
    conn = sqlite3.connect('notes.db')
    cursor = conn.cursor()
    cursor.execute('SELECT id, title, content, created_at, updated_at FROM notes WHERE id = ?', (note_id,))
    note = cursor.fetchone()
    conn.close()
    return note

# 添加新笔记
def add_note(title, content):
    now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    conn = sqlite3.connect('notes.db')
    cursor = conn.cursor()
    cursor.execute('INSERT INTO notes (title, content, created_at, updated_at) VALUES (?, ?, ?, ?)', 
                  (title, content, now, now))
    note_id = cursor.lastrowid
    conn.commit()
    conn.close()
    return note_id

# 更新笔记
def update_note(note_id, title, content):
    now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    conn = sqlite3.connect('notes.db')
    cursor = conn.cursor()
    cursor.execute('UPDATE notes SET title = ?, content = ?, updated_at = ? WHERE id = ?', 
                  (title, content, now, note_id))
    conn.commit()
    conn.close()

# 删除笔记
def delete_note(note_id):
    conn = sqlite3.connect('notes.db')
    cursor = conn.cursor()
    cursor.execute('DELETE FROM notes WHERE id = ?', (note_id,))
    conn.commit()
    conn.close()

# 渲染Markdown内容
def render_markdown(content):
    return markdown.markdown(content, extensions=['fenced_code', 'codehilite'])

# 主页路由\@app.route('/')
def index():
    # 获取搜索查询参数
    search_query = request.args.get('search', '').strip()
    
    # 获取笔记列表
    notes = get_all_notes(search_query)
    
    return render_template('index.html', notes=notes, search_query=search_query)

# 查看笔记路由\@app.route('/view/<int:note_id>')
def view_note(note_id):
    note = get_note_by_id(note_id)
    
    if not note:
        flash('笔记不存在！')
        return redirect(url_for('index'))
    
    # 渲染Markdown内容
    rendered_content = render_markdown(note[2])
    
    return render_template('view.html', note=note, rendered_content=rendered_content)

# 新建笔记路由\@app.route('/new', methods=['GET', 'POST'])
def new_note():
    if request.method == 'POST':
        title = request.form['title'].strip()
        content = request.form['content'].strip()
        
        if not title:
            flash('笔记标题不能为空！')
            return redirect(url_for('new_note'))
        
        if not content:
            flash('笔记内容不能为空！')
            return redirect(url_for('new_note'))
        
        note_id = add_note(title, content)
        flash('笔记创建成功！')
        return redirect(url_for('view_note', note_id=note_id))
    
    return render_template('edit.html', note=None, action='new')

# 编辑笔记路由\@app.route('/edit/<int:note_id>', methods=['GET', 'POST'])
def edit_note(note_id):
    note = get_note_by_id(note_id)
    
    if not note:
        flash('笔记不存在！')
        return redirect(url_for('index'))
    
    if request.method == 'POST':
        title = request.form['title'].strip()
        content = request.form['content'].strip()
        
        if not title:
            flash('笔记标题不能为空！')
            return redirect(url_for('edit_note', note_id=note_id))
        
        if not content:
            flash('笔记内容不能为空！')
            return redirect(url_for('edit_note', note_id=note_id))
        
        update_note(note_id, title, content)
        flash('笔记更新成功！')
        return redirect(url_for('view_note', note_id=note_id))
    
    return render_template('edit.html', note=note, action='edit')

# 删除笔记路由\@app.route('/delete/<int:note_id>')
def delete_note_route(note_id):
    note = get_note_by_id(note_id)
    
    if not note:
        flash('笔记不存在！')
    else:
        delete_note(note_id)
        flash('笔记删除成功！')
    
    return redirect(url_for('index'))

# 启动时初始化数据库
if __name__ == '__main__':
    init_db()
    print('简易笔记应用已启动！访问 http://localhost:5000 开始使用。')
    app.run(debug=True)